#include <thread>
#include <iostream>

using namespace std;

/*      使用C++线程库启动线程，可以归结为构造std::thread对象。
 *      线程在std::thread对象创建(为线程指定任务)时就启动了。
 *      这种函数在其所属线程上运行，直到函数执行完毕，线程也就结束了。
 *      std::thread的两个重要方法
 *      join()
 *      detach()
 *      启动了线程，需要明确是要等待线程结束(join)，还是让其自主运行(detach)。
 *      如果std::thread对象销毁之前还没有做出决定，程序就会终止(std::thread的析构函数会调用std::terminate())。
 *      一个std::thread对象只能调用join(),detach()中的一个，并且只能调用一次。
 */

class background_task
{
public:
    void operator()()
    {
        do_something();
        do_something_else();
    }
private:
    void do_something(){
        cout << "do_something" << endl;
    }
    void do_something_else(){
        cout << "do_something_else" << endl;
    }
};

int main(){
    background_task f;
    std::thread my_thread(f);
    cout << "main" << endl;
    // t.join()方法阻塞调用此方法的线程，直到线程t结束，此线程再继续
    // 对一个std::thread对象，join()函数只能调用一次
    my_thread.join();
    // t.detach()方法不阻塞调用此方法的线程，可能调用此方法的线程结束了，线程t还没结束。
    // 这样有 悬空引用 的风险。（比如exp2.2的例子）。
    // my_thread.detach();
    return 0;
}
